package server;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.*;

/**
 * 封装Request
 */
public class Request {
    //请求方式
    private String method;
    //请求资源
    private String url;
    //请求参数
    private Map<String, List<String>> parameterMapValues;
    //内部
    public static final String CRLF="\r\n";
    private InputStream is;
    private String requestInfo;
    public Request(){
        this.method="";
        this.url="";
        this.parameterMapValues=new HashMap<String, List<String>>();
        this.requestInfo="";
    }
    public Request(InputStream is){
        this();
        this.is=is;
        byte[] data=new byte[1024];
        try {
            int len=is.read(data);
            requestInfo=new String(data,0,len);
        } catch (IOException e) {
            return;
        }
        //分析请求信息
        parseRequestInfo();
    }

    /**
     * 分析请求信息
     */
    private void parseRequestInfo(){
        if (requestInfo ==null||(requestInfo=requestInfo.trim()).equals("")) {
            return;
        }
        /**
         *
         */
        String paramString="";//接收请求参数
        //1.获取请求方式
        String firstLine=requestInfo.substring(0,requestInfo.indexOf(CRLF));
        int idx=firstLine.indexOf("/");
        String urlStr=firstLine.substring(idx,firstLine.indexOf("Http/")).trim();
        this.method=firstLine.substring(0,idx).trim();
        if (this.method.equalsIgnoreCase("post")){
            this.url=urlStr;
            paramString=requestInfo.substring(requestInfo.lastIndexOf(CRLF)).trim();
        }else if (this.method.equalsIgnoreCase("get")){
            if (urlStr.contains("?")){//判断是否存在参数
                String[] urlArray=urlStr.split("\\?");
                this.url=urlArray[0];
                paramString=urlArray[1];//接收请求参数
            }else {
                this.url=urlStr;
            }
        }
        //将请求参数封装到Map中
        //不存在请求参数
        if (paramString.equals("")){
            return;
        }
        parseParams(paramString);
    }
    private void parseParams(String paramString){
        //分割
        StringTokenizer token=new StringTokenizer(paramString,"&");//以&符合进行分割字符串
        while (token.hasMoreTokens()){
            String keyValue=token.nextToken();
            String[] keyValues=keyValue.split("=");
            if (keyValues.length==1){
                keyValues = Arrays.copyOf(keyValues,2);
                keyValues[1]=null;
            }
            String key=keyValues[0].trim();
            String value=keyValues[1]==null?null:decode(keyValues[1].trim(),"gbk");
            //转换成Map
            if (!parameterMapValues.containsKey(key)){
                parameterMapValues.put(key,new ArrayList<String>());
            }
            List<String> values=parameterMapValues.get(key);
            values.add(value);
        }
    }

    /**
     * 解决中文问题
     * @param values
     * @param code
     * @return
     */
    private String decode(String values,String code){
        try {
            return java.net.URLDecoder.decode(values,code);
        } catch (UnsupportedEncodingException e) {
            //e.printStackTrace();
        }
        return null;
    }
    /**
     * 根据页面的name获取对应的多个值
     */
    public String[] getParameterValues(String name){
        List<String> values=null;
        if ((values=parameterMapValues.get(name))==null){
            return null;
        }else {
            return values.toArray(new String[0]);
        }
    }
    /**
     * 根据页面的name获取对应的值
     */
    public String getParameter(String name){
        String[] values=getParameterValues(name);
        if (values==null){
            return null;
        }
        return values[0];
    }
}
